﻿#define _CRT_SECURE_NO_WARNINGS 1

// DP16 合唱队形

//描述
//
//N位同学站成一排，音乐老师要请其中的(N - K) 位同学出列，使得剩下的K位同学排成合唱队形。
//
//合唱队形是指这样的一种队形：设K位同学从左到右依次编号为 1，2…，K，他们的身高分别为 T1，T2，…，TK，  则他们的身高满足
//t[1] < t[2]...< t[i] > t[i + 1] >... > t[k−1] > t[k] (1 ≤ i ≤ k)
//
//你的任务是，已知所有 n 位同学的身高，计算最少需要几位同学出列，可以使得剩下的同学排成合唱队形。
//
//数据范围： 1 ≤ n ≤ 1000 ，身高满足 130 ≤ t[i] ≤ 230
//输入描述：
//第一行输入一个正整数 n 表示同学的总数。
//第二行有 n 个整数，用空格分隔，第 i 个整数 t[i] 是第 i 位同学的身高(厘米)。
//输出描述：
//输出仅有一个整数，即最少需要几个同学出列
//示例1
//输入：
//8
//186 186 150 200 160 130 197 220
//
//输出：
//4



// 动态规划-以最长递增子序列变化而来
#include <iostream>
using namespace std;

const int N = 1001;
int n, t[N];
int f[N], g[N];
//f[i]:以i位置为结尾的序列中，最长递增子序列的长度(从前往后)
//g[i]:以i位置为结尾的序列中，最长递增子序列的长度(从后往前)

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) cin >> t[i];

    //从前往后
    for (int i = 0; i < n; i++)
    {
        f[i] = 1;
        for (int j = 0; j < i; j++)
        {
            if (t[i] > t[j]) f[i] = max(f[i], f[j] + 1);
        }
    }

    //从后往前
    for (int i = n - 1; i >= 0; i--)
    {
        g[i] = 1;
        for (int j = n - 1; j > i; j--)
        {
            if (t[i] > t[j]) g[i] = max(g[i], g[j] + 1);
        }
    }
    int ret = 0;
    for (int i = 0; i < n; i++) ret = max(ret, f[i] + g[i] - 1);

    cout << n - ret << endl;
    return 0;
}